package com.pad.dpscn.daag.sdk.common.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**  
 * Spring工具类，实现了ApplicationContextAware接口，用于在Spring容器中获取Bean对象。  
 * 通过静态方法可以直接获取Spring容器中的Bean，无需注入。  
 * @author yangdezhao  
 * @Component注解将该类标识为Spring组件，并将其实例化后交给Spring容器管理。  
 * @param "springUtils" 是该组件的名称，在Spring容器中可以通过这个名称获取该组件的实例。  
 */  
@Component("springUtils")  
public class SpringUtils implements ApplicationContextAware {  
  
    /**  
     * 静态变量，用于存储Spring的ApplicationContext对象，以便在静态方法中访问Spring容器。  
     */  
    private static ApplicationContext applicationContext;  
  
    /**  
     * 实现ApplicationContextAware接口的setApplicationContext方法，  
     * 用于设置ApplicationContext对象，通常由Spring容器在启动时自动调用。  
     *  
     * @param applicationContextParam Spring的ApplicationContext对象  
     * @throws BeansException 如果设置ApplicationContext对象时出错，则抛出BeansException异常  
     */  
    @Override  
    public void setApplicationContext(ApplicationContext applicationContextParam) throws BeansException {  
        applicationContext = applicationContextParam;  
    }  
  
    /**  
     * 获取Spring容器中指定ID的Bean对象。  
     *  
     * @param id Bean对象的ID  
     * @return 返回对应ID的Bean对象，如果未找到则返回null  
     */  
    public static Object getObject(String id) {  
        Object object = null;  
        object = applicationContext.getBean(id);  
        return object;  
    }  
  
    /**  
     * 泛型方法，根据指定的类类型获取Spring容器中的Bean对象。  
     *  
     * @param tClass 要获取的Bean对象的类类型  
     * @param <T> 泛型类型参数  
     * @return 返回对应类型的Bean对象  
     * @throws BeansException 如果获取Bean对象时出错，则抛出BeansException异常  
     */  
    public static <T> T getObject(Class<T> tClass) throws BeansException {  
        return applicationContext.getBean(tClass);  
    }  
  
    /**  
     * 根据Bean类的简单名称获取Bean对象。  
     * 注意：该方法依赖于Bean名称与类名的对应关系，可能不适用于所有情况。  
     *  
     * @param tClass Bean类的简单名称  
     * @return 返回对应类的Bean对象  
     * @throws BeansException 如果获取Bean对象时出错，则抛出BeansException异常  
     */  
    public static Object getBean(String tClass) throws BeansException {  
        return applicationContext.getBean(tClass);  
    }  
  
    /**  
     * 泛型方法，根据Bean名称和类类型获取Spring容器中的Bean对象。  
     *  
     * @param name Bean对象的名称  
     * @param tClass Bean对象的类类型  
     * @param <T> 泛型类型参数  
     * @return 返回对应名称和类型的Bean对象  
     * @throws BeansException 如果获取Bean对象时出错，则抛出BeansException异常  
     */  
    public static <T> Object getBean(String name, Class<T> tClass) throws BeansException {  
        return applicationContext.getBean(name, tClass);  
    }  
  
    /**  
     * 泛型方法，根据类类型获取Spring容器中的Bean对象。  
     *  
     * @param tClass 要获取的Bean对象的类类型  
     * @param <T> 泛型类型参数  
     * @return 返回对应类型的Bean对象  
     * @throws BeansException 如果获取Bean对象时出错，则抛出BeansException异常  
     */  
    public <T> T getBean(Class<T> tClass) throws BeansException {  
        return applicationContext.getBean(tClass);  
    }  
}